Memory Operands
Data transfer instructions指令 (lw,sw)
把資料從記憶體搬移到暫存器
明確的告訴prossesor我們的資料將要被搬到哪一個暫存器
明確的指出我們要存取的資料的記憶體位址是在哪裡
記憶體可視為 :
1D array一微陣列,用pointer存取他
Offset偏差 :
以pointer作為基礎(pointer base)的偏差值
例子 : 8($t0)
t0當作register base
Offset : 8 bytes
有效記憶體 :
又因為register總共的長度是32個bit (8 bytes*4=32bits)
所以實際上在MIPS的架構有效記憶體的長度就是32個bit (2^32約4GB)
指令介紹 :
lw (load word)
把一個word從記憶體搬移到暫存器
lw $t0,12($s0)
lw /destination /offset /base register
<====================
把暫存器s0的值再加上12個bytes
當成是一個記憶體的位址
把它的值放到t0這個暫存器裡面
sw (store word)
把資料從register搬回memory (資料單元方向顛倒)
sw $t0,12($s0)
sw /destination /offset /base register
====================>
sw把t0這個暫存器裡面的值移動到
以s0當成base再加上12個bytes作為Offset 所得到的記憶體位址
byte address以及word address
每一個小方塊代表的是一個byte
而相同顏色的4個小方塊代表的是一個word
比較 :
把它們的記憶體位址用二進位的表示法來表示出來
byte address和word address相差四倍(2^2)
所以在byte address裡面 最低位元的兩個bit一定都會為0
Alignment
所有的word當它被擺到記憶體的時候
實際上它的"起始位址"一定要是4個byte的整數倍
Endianness
因為一個word是由好幾個byte所共同組合而成的
word放到記憶體的時候
每一個byte所"擺放的順序"決定了它是 Big Endian 或是 Little Endian
data: 高位元 ---> 低位元 (想想二進位ex:10011 誰是高誰是低)
Big Endian (MIPS就是!)
把最高位元 放在word的起始位址
Little Endian (x86屬於此類)
把最低位元 放到word的起始位址
現在有一組資料 :
最高位元 最低位元
0 1 2 3
@ 記憶體位置由左邊開始(箭頭處)
例子 :
現在有一組資料 :
0A 0B 0C 0D